package com.deram.ctin.serv.main.helper;

import com.deram.ctin.common.error.BusinessException;
import com.deram.ctin.common.utils.ArrayHandleUtils;
import com.deram.ctin.common.vo.GexfEdgeVo;
import com.deram.ctin.common.vo.GexfNodeVo;
import com.deram.ctin.common.vo.GexfVo;
import com.deram.ctin.serv.main.vo.EnterRelationVo;

/**
 * @author zhangcm
 * @version 1.0, 2017/9/28
 */
public class EnterRelationHelper {

    private EnterRelationHelper(){}

    /**
     * 生成Gexf对象
     * @param relationVo
     * @return
     */
    public static GexfVo parseGexf(EnterRelationVo relationVo){
        GexfVo result = new GexfVo();
        addGexfNode(result, relationVo);
        addGexfEdge(result, relationVo);
        return result;
    }

    /**
     * 添加Node
     * @param gexfVo
     * @param relationVo
     */
    private static void addGexfNode(GexfVo gexfVo, EnterRelationVo relationVo){
        addGexfNodeRecursion(gexfVo, relationVo);
        ArrayHandleUtils.uniqueInList(gexfVo.getNodeList());
    }

    /**
     * 添加Edge
     * @param gexfVo
     * @param relationVo
     */
    private static void addGexfEdge(GexfVo gexfVo, EnterRelationVo relationVo){
        addGexfEdgeRecursion(gexfVo, relationVo);
        ArrayHandleUtils.uniqueInList(gexfVo.getEdgeList());
        for (int i = 0; i < gexfVo.getEdgeList().size(); i++) {
            GexfEdgeVo obj = gexfVo.getEdgeList().get(i);
            obj.setId("r" + (i + 1));
        }
    }

    private static void addGexfNodeRecursion(GexfVo gexfVo, EnterRelationVo relationVo){
        GexfNodeVo nodeVo = new GexfNodeVo();
        nodeVo.setId(getGexfNodeId(relationVo));
        nodeVo.setLabel(relationVo.getName());
        nodeVo.setAttvalue(getGexfNodeAttvalue(relationVo));
        gexfVo.getNodeList().add(nodeVo);
        for (EnterRelationVo child : relationVo.getChildList()) {
            addGexfNodeRecursion(gexfVo, child);
        }
    }

    private static void addGexfEdgeRecursion(GexfVo gexfVo, EnterRelationVo relationVo){
        for (EnterRelationVo child : relationVo.getChildList()) {
            GexfEdgeVo edgeVo = new GexfEdgeVo();
            edgeVo.setLabel(child.getRelation());
            edgeVo.setSource(getGexfNodeId(relationVo));
            edgeVo.setTarget(getGexfNodeId(child));
            gexfVo.getEdgeList().add(edgeVo);
            addGexfEdgeRecursion(gexfVo, child);
        }
    }

    private static String getGexfNodeId(EnterRelationVo relationVo){
        StringBuilder sb = new StringBuilder();
        if(1 == relationVo.getType()){
            sb.append("c");
        } else if(2 == relationVo.getType()){
            sb.append("p");
        } else {
            throw new BusinessException("不支持该类型");
        }
        sb.append(relationVo.getId().toString());
        return sb.toString();
    }

    private static String getGexfNodeAttvalue(EnterRelationVo relationVo){
        if(1 == relationVo.getType()){
            return "1";
        } else if(2 == relationVo.getType()){
            return "0";
        } else {
            throw new BusinessException("不支持该类型");
        }
    }
}
